package br.com.financeiro.dao;
import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import br.com.financeiro.helpers.DataBaseHelper;
import br.com.financeiro.model.TipoConta;


public class TipoContaDao {

	public static final String NOME_TABELA = "tipo_conta";
    public static final String COLUNA_ID = "id";
    public static final String COLUNA_DESCRICAO = "descricao";
    public static final String COLUNA_DESPESA = "despesa";
 
    public static final String SCRIPT_CRIACAO_TABELA_TIPO_CONTA = "CREATE TABLE " + NOME_TABELA + "("
            + COLUNA_ID + " INTEGER PRIMARY KEY ," + COLUNA_DESCRICAO + " TEXT,"+ COLUNA_DESPESA + " TEXT" + ");";
 
    public static final String SCRIPT_DELECAO_TABELA =  "DROP TABLE IF EXISTS " + NOME_TABELA;
 
 
    private SQLiteDatabase dataBase = null;
 
 
    private static TipoContaDao instance;
     
    public static TipoContaDao getInstance(Context context) {
        if(instance == null)
            instance = new TipoContaDao(context);
        return instance;
    }
 
    private TipoContaDao(Context context) {
        DataBaseHelper dataBaseHelper = DataBaseHelper.getInstance(context);
        dataBase = dataBaseHelper.getWritableDatabase();
    }
 
    public void salvar(TipoConta tipoConta) {
        ContentValues values = gerarContentValeuesTipoConta(tipoConta);
        dataBase.insert(NOME_TABELA, null, values);
    }
 
    public List<TipoConta> recuperarTodos() {
        String queryReturnAll = "SELECT * FROM " + NOME_TABELA;
        Cursor cursor = dataBase.rawQuery(queryReturnAll, null);
        List<TipoConta> tipoContas = construirTipoContaPorCursor(cursor);
 
        return tipoContas;
    }
    
    public TipoConta recuperarPelaPosicao(int posicao) {
    	  String queryReturnAll = "SELECT * FROM " + NOME_TABELA;
          Cursor cursor = dataBase.rawQuery(queryReturnAll, null);
          List<TipoConta> tipoContas = construirTipoContaPorCursor(cursor);
   
          return tipoContas.get(posicao);
    }
 
    public TipoConta recuperarPeloId(int id) {
  	  String queryReturnAll = "SELECT * FROM " + NOME_TABELA + " WHERE ID = " + id;
        Cursor cursor = dataBase.rawQuery(queryReturnAll, null);
        List<TipoConta> tipoContas = construirTipoContaPorCursor(cursor);
        if(!tipoContas.isEmpty()){        	
        	return tipoContas.get(0);
        }else{
        	return new TipoConta();
        }
  }
    
    public void deletar(TipoConta TipoConta) {
 
        String[] valoresParaSubstituir = {
                String.valueOf(TipoConta.getId())
        };
 
        dataBase.delete(NOME_TABELA, COLUNA_ID + " =  ?", valoresParaSubstituir);
    }
 
    public void editar(TipoConta TipoConta) {
        ContentValues valores = gerarContentValeuesTipoConta(TipoConta);
 
        String[] valoresParaSubstituir = {
                String.valueOf(TipoConta.getId())
        };
 
        dataBase.update(NOME_TABELA, valores, COLUNA_ID + " = ?", valoresParaSubstituir);
    }
 
    public void fecharConexao() {
        if(dataBase != null && dataBase.isOpen())
            dataBase.close(); 
    }
 
 
    private List<TipoConta> construirTipoContaPorCursor(Cursor cursor) {
        List<TipoConta> tipoContas = new ArrayList<TipoConta>();
        if(cursor == null)
            return tipoContas;
         
        try {
 
            if (cursor.moveToFirst()) {
                do {
 
                    int indexID = cursor.getColumnIndex(COLUNA_ID);
                    int indexDescricao = cursor.getColumnIndex(COLUNA_DESCRICAO);
                    int indexDespesa = cursor.getColumnIndex(COLUNA_DESPESA);
 
                    int id = cursor.getInt(indexID);
                    String descricao = cursor.getString(indexDescricao);
                    int despesa = cursor.getInt(indexDespesa);
 
                    TipoConta tipoConta = new TipoConta();
                    tipoConta.setId(id);
                    tipoConta.setDescricao(descricao);
                    tipoConta.setDespesa(despesa);
                    tipoContas.add(tipoConta);
 
                } while (cursor.moveToNext());
            }
             
        } finally {
            cursor.close();
        }
        return tipoContas;
    }
 
    private ContentValues gerarContentValeuesTipoConta(TipoConta TipoConta) {
        ContentValues values = new ContentValues();
        values.put(COLUNA_DESCRICAO, TipoConta.getDescricao());
        values.put(COLUNA_DESPESA, TipoConta.getDespesa());
 
        return values;
    }
    
    public TipoConta findByDescricao(String descricao){
    	String queryReturnAll = "SELECT * FROM " + NOME_TABELA + " WHERE " + COLUNA_DESCRICAO + " = " + "'" +descricao+ "'";
        Cursor cursor = dataBase.rawQuery(queryReturnAll, null);
        List<TipoConta> tipoContas = construirTipoContaPorCursor(cursor);
        if(!tipoContas.isEmpty()){        	
        	return tipoContas.get(0);
        }else{
        	return new TipoConta();
        }
    }
}
